#include "musicslider.h"
#include "music.h"
#include "ui_musicslider.h"

musicSlider::musicSlider(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::musicSlider)
{
    ui->setupUi(this);
    // 初始化当前位置为0
    current_pos_ = 0;
    // 设置最大宽度为0
    maxWidth_ = 0;
    // 调用滑块移动函数
    moveSlider();
}

/**
 * @brief 设置滑块位置
 * @param radio 位置比例值，范围为0.0到1.0之间
 * @details 该函数根据给定的比例值计算滑块的当前位置，
 *          并调用moveSlider()函数更新滑块的显示位置。
 *          比例值0.0表示滑块在最左侧，1.0表示滑块在最右侧。
 * @note 此函数用于外部控制滑块位置，例如响应音乐播放进度变化
 */
void musicSlider::setStep(const float radio)
{
    // 根据比例值计算滑块的当前位置
    current_pos_ = maxWidth_ * radio;
    // 更新滑块的显示位置
    moveSlider();
}


musicSlider::~musicSlider()
{
    delete ui;
}
/**
 * @brief 处理鼠标按下事件
 * @param event 鼠标事件对象，包含鼠标按下时的位置信息
 * @details 该函数在用户按下鼠标时被调用，用于设置滑块的当前位置。
 *          通过获取鼠标点击位置的x坐标来确定滑块的新位置，
 *          并调用moveSlider()函数更新滑块的显示位置。
 * @note 此函数重写了父类QWidget的mousePressEvent虚函数
 */
void musicSlider::mousePressEvent(QMouseEvent *event)
{
    // 设置当前滑块位置为鼠标点击位置的x坐标
    current_pos_ = event->pos().x();
    // 更新滑块的显示位置
    moveSlider();
}

/**
 * @brief 处理鼠标移动事件
 * @param event 鼠标事件对象，包含鼠标移动时的位置信息
 * @details 该函数在用户拖动鼠标时被调用，用于实时更新滑块位置。
 *          函数会检查鼠标是否在滑块范围内，如果鼠标左键被按下，
 *          则根据鼠标当前位置更新滑块位置，并确保滑块位置在有效范围内。
 * @note 此函数重写了父类QWidget的mouseMoveEvent虚函数
 */
void musicSlider::mouseMoveEvent(QMouseEvent *event)
{
    // 定义滑块的有效区域
    const QRect music_slider_rect = QRect(0, 0, geometry().width(), geometry().height());
    // 检查鼠标是否在滑块有效区域内
    if (!music_slider_rect.contains(event->pos()))
    {
        Debug << music_slider_rect << "-" << event->pos();
        return;
    }
    // 检查鼠标左键是否被按下
    if (event->buttons() == Qt::LeftButton)
    {
        // 设置当前滑块位置为鼠标位置的x坐标
        current_pos_ = event->pos().x();
        // 确保滑块位置不小于0
        if (current_pos_ < 0)
            current_pos_ = 0;
        // 确保滑块位置不超过最大宽度
        if (current_pos_ > maxWidth_)
            current_pos_ = maxWidth_;
        // 更新滑块的显示位置
        moveSlider();
    }
}

/**
 * @brief 处理鼠标释放事件
 * @param event 鼠标事件对象，包含鼠标释放时的位置信息
 * @details 该函数在用户释放鼠标时被调用，用于设置滑块的最终位置，
 *          并发出setMusicSliderPosition信号通知音乐播放位置的改变。
 *          信号参数为滑块位置占总宽度的比例值。
 * @note 此函数重写了父类QWidget的mouseReleaseEvent虚函数
 */
void musicSlider::mouseReleaseEvent(QMouseEvent *event)
{
    // 设置当前滑块位置为鼠标释放位置的x坐标
    current_pos_ = event->pos().x();
    // 更新滑块的显示位置
    moveSlider();
    // 发出信号通知音乐播放位置改变，参数为位置比例值
    emit setMusicSliderPosition(ui->outLine->width() / static_cast<float>(maxWidth_));
}

/**
 * @brief 移动滑块到当前设定位置
 * @details 该函数根据current_pos_成员变量的值更新滑块的几何形状，
 *          通过调整滑块前景部分的宽度来实现滑块位置的可视化。
 * @note 此函数是const成员函数，不会修改对象状态
 */
void musicSlider::moveSlider() const
{
    // 根据当前滑块位置设置滑块前景部分的宽度
    ui->outLine->setGeometry(ui->outLine->x(), ui->outLine->y(), current_pos_, ui->outLine->height());
}

